package net;

// TCP回显客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {
    // 客户端需要使用socket与服务器建立连接
    private Socket socket = null;

    // 构造方法，此时要和服务器建立连接，所以就需要知道服务器的IP和端口号了
    // 客户端的IP就是运行的主机IP，端口号就是系统自动分配的端口号
    public TcpEchoClient(String serverIP, int serverPort) throws IOException {
        // 这里和UDP客户端差别较大，TCP要先和客户端建立连接
        socket = new Socket(serverIP,serverPort);  // 初始化
    }

    public void start() {
        Scanner scanner = new Scanner(System.in);
        // TCP是数据流（注意获取是在循环之外！）：注意不是进行new的！！
        try(InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream()) {
            while (true) {
                // 1.从控制台读取数据，构造成一个请求
                System.out.print("-> ");
                String request = scanner.next();

                // 2.发送请求给服务器
                PrintWriter printWriter = new PrintWriter(outputStream); // 注意对应参数是输出流（写入）
                printWriter.println(request);
                // 一定要进行刷新！不要遗忘!!否则可能导致请求没有真正发送出去！！
                printWriter.flush();

                // 3.从服务器读取响应
                Scanner respScanner = new Scanner(inputStream); // 读取是输入流！
                String response = respScanner.next();

                // 4.把响应显示到界面上
                System.out.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 上面的socket只有一个对象，所以是不需要关闭的，因为其实不太会把文件描述符表给占满
    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient client = new TcpEchoClient("127.0.0.1",9090);
        client.start();
    }
}
